#ifndef EQUIPO_H
#define EQUIPO_H

#include <stddef.h>
#include <stdbool.h>

/*****************************************************************
 *        	DEFINICION DEL TIPO DE DATO Y FUNCIONES
 *****************************************************************/
typedef bool (*visitar_t)(const char *, void *, void *);

typedef struct equipo equipo_t;

/*****************************************************************
 *        		PRIMITIVAS DE TAD EQUIPO
 *****************************************************************/

/*
*Post: Crea un tipo de dato equipo_t al cual se le adjudica el 
*nombre pasado por parametro.*/
equipo_t *equipo_crear(const char *nombre);

/*Post: Destruye el tipo de dato equipo_t*/
void equipo_destruir(void* dato_equipo);

/*
*Agrega un nuevo jugador al plantel del equipo y le 
*adjudica el nombre pasado por parametro.
*PostDevuelve un numero distinto de 0 indicando la cantidad de 
*jugadores actuales, el mismo tambien representa el dorsal del 
*nuevo jugador. 
*Devuelve 0 si ocurrio algun error en el proceso.*/
size_t equipo_agregar_jugador(equipo_t *equipo, const char * jugador);

/*Remueve el ultimo jugador agregado al planten del equipo
*Post: Devuelve true si el proceso se pudo llevar a cabo.*/
bool equipo_quitar_ultimo_jugador(equipo_t *equipo);

/*
*Post: Devuelve el nombre del jugador asociado al dorsal pasado
*por parametro. NULL si el dorsal no corresponde a un jugador*/
const char *equipo_obtener_jugador(equipo_t *equipo, size_t dorsal);

/*
*Las siguientes dos funciones recorren el plantel del equipo
*procesando a los jugadores contenidos en él mediante la funcion
*visitar_t. 
*El primero recorre el plantel de acurdo al nombre de los 
*jugadores en orden alfabetico.
*El segundo lo hace de acuerdo al dorsal de los jugadores en 
*orden ascendente.*/
void equipo_iterar_plantel(const equipo_t *equipo, visitar_t visitar, void *extra);

void equipo_listar_plantel(const equipo_t *equipo, visitar_t visitar, void *extra);

#endif
